package com.example.djetpack.room

import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
import androidx.room.migration.Migration
import androidx.sqlite.db.SupportSQLiteDatabase
import com.example.djetpack.AppGlobals

@TypeConverters(DateConvert::class)
@Database(entities = [Cache::class, User::class], version = 2, exportSchema = true)
abstract class CacheDatabase : RoomDatabase() {


    companion object {
        private var database : CacheDatabase?= null
        @Synchronized
        fun get(): CacheDatabase {
            //内存数据库,也就是说这种数据库当中存储的数据，只会存留在内存当中，进程被杀死之后，数据随之丢失
            //database=  Room.inMemoryDatabaseBuilder(context,CacheDatabase::class.java).build()

            database =  Room.databaseBuilder(AppGlobals.get()!!, CacheDatabase::class.java, "jetpack")
                //是否允许在主线程上操作数据库，默认false。
                //相比sqlite法无明文禁止即可为来说，Room给出了规范
                .allowMainThreadQueries()
                //数据库创建和打开的事件会回调到这里，可以再次操作数据库
                .addCallback(callback)
                //指定数据查询数据时候的线程池,
               // .setQueryExecutor(cacheThreadPool)
                //它是用来创建supportsqliteopenhelper
                //可以利用它实现自定义的sqliteOpenHelper，来实现数据库的加密存储，默认是不加密的
               // .openHelperFactory()
                //数据库升级 1---2
                .addMigrations(migration1_2)
                .build()
            return database!!
        }

        val callback = object : RoomDatabase.Callback() {
            override fun onCreate(db: SupportSQLiteDatabase) {
                super.onCreate(db)
            }

            override fun onOpen(db: SupportSQLiteDatabase) {
                super.onOpen(db)
            }
        }
        //这里演示下数据库从version1->version2的升级过程
        //注意，一旦数据库被创建，只要任意对象的任意字段有改动
        //Database注解的version字段都需要升级，同时需要指定升级的行为migration
        val migration1_2 = object : Migration(1,2){
            override fun migrate(database: SupportSQLiteDatabase) {
                database.execSQL("alter table table_cache add column cache_time LONG")
            }
        }
    }
}